﻿
namespace LM.Negocio.Validadores
{
    using LM.InterfacesFabricas.Interfaces.Repositorios;
    using LM.Negocio.Objetos;
    using System;
    using System.Linq;

    public class ValidadorDeMarca : ValidadorAbastrato
    {
        private Marca _objetoValidado;

        private IRepositorioDeConsultaDeObjetos<Marca> _repositorioDeMarca;

        public ValidadorDeMarca( IRepositorioDeConsultaDeObjetos<Marca> repositorioDeMarca )
        {
            if ( repositorioDeMarca == null )
            {
                throw new ArgumentNullException( "repositorioDeMarca" );
            }

            _repositorioDeMarca = repositorioDeMarca;
        }

        public void ValideCadastro( Marca marca )
        {
            if ( marca == null )
            {
                throw new ArgumentException( "marca" );
            }

            _objetoValidado = marca;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideDescricaoNaoInformada();
            ValideMarcaJaCadastrada();

            base.GarantaSucesso();
        }

        public void ValideAtualizacao( Marca marca )
        {
            if ( marca == null )
            {
                throw new ArgumentException( "marca" );
            }

            _objetoValidado = marca;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideDescricaoNaoInformada();
            ValideMarcaNaoCadastrada();

            base.GarantaSucesso();
        }

        public void ValideExclusao( Marca marca )
        {
            if ( marca == null )
            {
                throw new ArgumentException( "marca" );
            }

            _objetoValidado = marca;
            base.LimpeInconsistencias();

            ValideMarcaNaoCadastrada();

            base.GarantaSucesso();
        }

        private void ValideCodigoNaoInformado()
        {
            if ( _objetoValidado.Codigo == 0 )
            {
                AdicioneInconsistencia( "Código não informado." );
            }
        }

        private void ValideDescricaoNaoInformada()
        {
            if ( String.IsNullOrWhiteSpace( _objetoValidado.Descricao ) )
            {
                AdicioneInconsistencia( "Descrição não informada." );
            }
        }

        private bool MarcaJaCadastrada()
        {
            return _repositorioDeMarca.Consulte( m => m.Codigo == _objetoValidado.Codigo ).Any();
        }

        private void ValideMarcaJaCadastrada()
        {
            if ( MarcaJaCadastrada() )
            {
                AdicioneInconsistencia( "Já existe uma Marca cadastrada com o código {0}.", _objetoValidado.Codigo );
            }
        }

        private void ValideMarcaNaoCadastrada()
        {
            if ( !MarcaJaCadastrada() )
            {
                AdicioneInconsistencia( "Marca com o código {0} não cadastrada.", _objetoValidado.Codigo );
            }
        }
    }
}
